suppressPackageStartupMessages({
  library(tweenr)
  library(gganimate)
  library(tidyverse)
})
windowsFonts(Raleway = windowsFont("Raleway"))
pal1 <- c("#969457", "#357c57")
pal2 <- c("#b7e972", "#377368")
pal3 <- c("#969457", "#357c57", "#b7e972", "#377368")

Pesqueros

Arribos CA

Paleta1

read_csv("GSB_Landings.csv", col_types = cols()) %>% 
  gather(Procedencia, Captura, -Year) %>% 
  ggplot(aes(x = Year, y = Captura, color = Procedencia)) +
  geom_line(size = 1.1) +
  theme_classic() +
  theme(legend.justification = c(0.5, 0.5),
        legend.position = c(0.7, 0.7),
        text = element_text(family = "Raleway", size = 18)) +
  scale_color_manual(values = pal1) +
  labs(x = "Año", y = "Arribos comerciales de Mero Gigante en California (Toneladas)") +
  scale_x_continuous(breaks = seq(1920, 2010, 10), minor_breaks = NULL) +
  scale_y_continuous(breaks = seq(0, 375, 75), minor_breaks = NULL, expand = c(0, 0))

ggsave("Paleta1.tiff", dpi = 600, width = 16, height = 8)

Paleta 2

Paleta 1 animada

plot_data <- read_csv("GSB_Landings.csv", col_types = cols()) %>% 
  gather(Procedencia, Arribos, -Year) %>% 
  mutate(ease = "linear", x = Year) %>% 
  rename(y = Arribos, id = Procedencia, time = Year) 
tween_plot <- plot_data %>%
  tween_elements(., "time", "id", "ease", nframes = 250) %>%   #using tweenr!
  mutate(year = round(time), id = .group) %>%
  left_join(plot_data, by = c("time", "y", "x", "id")) %>% 
  rename(Procedencia = id) %>% 
  ggplot(aes(x = x, y = y, frame = .frame, color = Procedencia)) +
  geom_path(aes(group = Procedencia, cumulative = T), size = 1.1) +
  theme_classic() +
  theme(legend.justification = c(0.5, 0.5),
        legend.position = c(0.7, 0.7),
        text = element_text(family = "Raleway", size = 18)) +
  scale_color_manual(values = pal1) +
  labs(x = "Año", y = "Arribos (Toneladas)") +
  scale_x_continuous(breaks = seq(1920, 2010, 10), minor_breaks = NULL) +
  scale_y_continuous(breaks = seq(0, 375, 75), minor_breaks = NULL)
Column `id` joining factor and character vector, coercing into character vectorIgnoring unknown aesthetics: cumulative
gganimate(tween_plot, title_frame = FALSE, interval = 0.001, "Landings_CA.gif", ani.width = 800, ani.height = 500)

Arribos Mexico

Biologicos

bio <- read.csv(file = "records.csv", stringsAsFactors = F) %>% 
  select(Species, Site, Sale_price_pkg, Fish_Market_name, Catch_site, Pesca_Objetivo, Weight, Total_Length, Head_Length, Weight_notes, Otoliths, Collector) %>% 
  magrittr::set_colnames(value = tolower(colnames(.)))

Registros por persona

colectores <- group_by(bio, site, collector) %>% 
  count() %>% 
  ggplot(aes(x = collector, y = n)) +
  geom_col(aes(fill = site), color = "black") +
  cowplot::theme_cowplot() +
  theme(legend.justification = c(1, 1),
        legend.position = c(0.9, 0.9)) +
  scale_fill_brewer(palette = "Set1") +
  ggExtra::rotateTextX()
plotly::ggplotly(colectores)

Histogramas

tl <- ggplot(bio, aes(x = total_length)) +
  geom_histogram(binwidth = 5 , fill = pal1[2], color = "black") +
  theme_classic()

tl2 <- ggplot(bio, aes(x = total_length)) +
  geom_density(binwidth = 5 , fill = pal1[2], color = "black") +
  theme_classic()

tw <- ggplot(bio, aes(x = weight)) +
  geom_histogram(binwidth = 5 , fill = pal1[2], color = "black") +
  theme_classic()

tw2 <- ggplot(bio, aes(x = weight)) +
  geom_density(binwidth = 5 , fill = pal1[2], color = "black") +
  theme_classic()

cowplot::plot_grid(tl, tl2, tw, tw2, ncol = 2, labels = "AUTO")
model <- lm(log10(weight)~log10(total_length), data = bio)
tidy_model <- broom::tidy(model)
glance_model <- broom::glance(model)
text_linear <- c("log10(TW) = -5.0363 + log10(TL)^3.1198")
text_exp <- c("TW = 10^(-5.0363)*(TL^3.1198)")

TW vs TL

line <- data.frame(x = seq(0, 210, by = 1)) %>% 
  mutate(y = 10^(-5.0363)*(x^3.1198))
LW <- filter(bio, !is.na(total_length),
             !is.na(weight)) %>%  
  mutate(weight_notes = ifelse(is.na(weight_notes), "No notes", weight_notes),
         site = ifelse(is.na(site), "Missing", site)) %>% 
  ggplot(aes(x = total_length, y = weight)) +
  geom_line(data = line, aes(x = x, y = y), linetype = "dashed") +
  geom_point(size = 2, alpha = 0.5, aes(color = weight_notes, site = site, otolitos = otoliths)) +
  scale_color_brewer(palette = pal3) +
  labs(x = "Total Length (cm)", y = "Total Weight (Kg)") +
  ggtitle(text_exp)
Ignoring unknown aesthetics: site, otolitosthe condition has length > 1 and only the first element will be usedUnknown palette #969457#357c57#b7e972#377368
plotly::ggplotly(LW)
LW <- filter(bio, !is.na(total_length),
             !is.na(weight)) %>%  
  mutate(weight_notes = ifelse(is.na(weight_notes), "No notes", weight_notes),
         site = ifelse(is.na(site), "Missing", site)) %>% 
  ggplot(aes(x = log10(total_length), y = log10(weight), color = weight_notes, site = site, otolitos = otoliths, Weight = weight, Length = total_length)) +
  geom_abline(slope = 3.1198, intercept = -5.0363, linetype = "dashed") +
  geom_point(size = 2) +
  scale_color_brewer(palette = pal3) +
  labs(x = "Total Length (cm)", y = "Total Weight (Kg)") +
  ggtitle(text_linear)
the condition has length > 1 and only the first element will be usedUnknown palette #969457#357c57#b7e972#377368
plotly::ggplotly(LW)
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6DQogICAgaHRtbF9ub3RlYm9vazoNCiAgICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgICAgdG9jOiB5ZXMNCiAgICAgIHRvY19mbG9hdDogeWVzDQotLS0NCg0KYGBge3J9DQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMoew0KICBsaWJyYXJ5KHR3ZWVucikNCiAgbGlicmFyeShnZ2FuaW1hdGUpDQogIGxpYnJhcnkodGlkeXZlcnNlKQ0KfSkNCg0Kd2luZG93c0ZvbnRzKFJhbGV3YXkgPSB3aW5kb3dzRm9udCgiUmFsZXdheSIpKQ0KYGBgDQoNCmBgYHtyfQ0KcGFsMSA8LSBjKCIjOTY5NDU3IiwgIiMzNTdjNTciKQ0KDQpwYWwyIDwtIGMoIiNiN2U5NzIiLCAiIzM3NzM2OCIpDQoNCnBhbDMgPC0gYygiIzk2OTQ1NyIsICIjMzU3YzU3IiwgIiNiN2U5NzIiLCAiIzM3NzM2OCIpDQpgYGANCg0KIyBQZXNxdWVyb3MNCg0KIyMgQXJyaWJvcyBDQQ0KDQojIyMgUGFsZXRhMQ0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTYsIGZpZy5oZWlnaHQgPSA4fQ0KcmVhZF9jc3YoIkdTQl9MYW5kaW5ncy5jc3YiLCBjb2xfdHlwZXMgPSBjb2xzKCkpICU+JSANCiAgZ2F0aGVyKFByb2NlZGVuY2lhLCBDYXB0dXJhLCAtWWVhcikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBZZWFyLCB5ID0gQ2FwdHVyYSwgY29sb3IgPSBQcm9jZWRlbmNpYSkpICsNCiAgZ2VvbV9saW5lKHNpemUgPSAxLjEpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAuNSwgMC41KSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYygwLjcsIDAuNyksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIlJhbGV3YXkiLCBzaXplID0gMTgpKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBwYWwxKSArDQogIGxhYnMoeCA9ICJBw7FvIiwgeSA9ICJBcnJpYm9zIGNvbWVyY2lhbGVzIGRlIE1lcm8gR2lnYW50ZSBlbiBDYWxpZm9ybmlhIChUb25lbGFkYXMpIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE5MjAsIDIwMTAsIDEwKSwgbWlub3JfYnJlYWtzID0gTlVMTCkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDM3NSwgNzUpLCBtaW5vcl9icmVha3MgPSBOVUxMLCBleHBhbmQgPSBjKDAsIDApKQ0KDQpnZ3NhdmUoIlBhbGV0YTEudGlmZiIsIGRwaSA9IDYwMCwgd2lkdGggPSAxNiwgaGVpZ2h0ID0gOCkNCmBgYA0KDQojIyMgUGFsZXRhIDINCg0KYGBge3IsIGZpZy53aWR0aCA9IDE2LCBmaWcuaGVpZ2h0ID0gOH0NCnJlYWRfY3N2KCJHU0JfTGFuZGluZ3MuY3N2IiwgY29sX3R5cGVzID0gY29scygpKSAlPiUgDQogIGdhdGhlcihQcm9jZWRlbmNpYSwgQ2FwdHVyYSwgLVllYXIpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gWWVhciwgeSA9IENhcHR1cmEsIGNvbG9yID0gUHJvY2VkZW5jaWEpKSArDQogIGdlb21fbGluZShzaXplID0gMS4xKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLjUsIDAuNSksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC43LCAwLjcpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJSYWxld2F5Iiwgc2l6ZSA9IDIwKSkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gcGFsMikgKw0KICBsYWJzKHggPSAiQcOxbyIsIHkgPSAiQXJyaWJvcyBjb21lcmNpYWxlcyBkZSBNZXJvIEdpZ2FudGUgZW4gQ2FsaWZvcm5pYSBcbihUb25lbGFkYXMpIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE5MjAsIDIwMTAsIDEwKSwgbWlub3JfYnJlYWtzID0gTlVMTCkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDM3NSwgNzUpLCBtaW5vcl9icmVha3MgPSBOVUxMLCBleHBhbmQgPSBjKDAsIDApKQ0KDQpnZ3NhdmUoIlBhbGV0YTIudGlmZiIsIGRwaSA9IDYwMCwgd2lkdGggPSAxNiwgaGVpZ2h0ID0gOCkNCg0KYGBgDQoNCiMjIyBQYWxldGEgMSBhbmltYWRhDQoNCmBgYHtyfQ0KcGxvdF9kYXRhIDwtIHJlYWRfY3N2KCJHU0JfTGFuZGluZ3MuY3N2IiwgY29sX3R5cGVzID0gY29scygpKSAlPiUgDQogIGdhdGhlcihQcm9jZWRlbmNpYSwgQXJyaWJvcywgLVllYXIpICU+JSANCiAgbXV0YXRlKGVhc2UgPSAibGluZWFyIiwgeCA9IFllYXIpICU+JSANCiAgcmVuYW1lKHkgPSBBcnJpYm9zLCBpZCA9IFByb2NlZGVuY2lhLCB0aW1lID0gWWVhcikgDQoNCnR3ZWVuX3Bsb3QgPC0gcGxvdF9kYXRhICU+JQ0KICB0d2Vlbl9lbGVtZW50cyguLCAidGltZSIsICJpZCIsICJlYXNlIiwgbmZyYW1lcyA9IDI1MCkgJT4lICAgI3VzaW5nIHR3ZWVuciENCiAgbXV0YXRlKHllYXIgPSByb3VuZCh0aW1lKSwgaWQgPSAuZ3JvdXApICU+JQ0KICBsZWZ0X2pvaW4ocGxvdF9kYXRhLCBieSA9IGMoInRpbWUiLCAieSIsICJ4IiwgImlkIikpICU+JSANCiAgcmVuYW1lKFByb2NlZGVuY2lhID0gaWQpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0geCwgeSA9IHksIGZyYW1lID0gLmZyYW1lLCBjb2xvciA9IFByb2NlZGVuY2lhKSkgKw0KICBnZW9tX3BhdGgoYWVzKGdyb3VwID0gUHJvY2VkZW5jaWEsIGN1bXVsYXRpdmUgPSBUKSwgc2l6ZSA9IDEuMSkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMC41LCAwLjUpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKDAuNywgMC43KSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiUmFsZXdheSIsIHNpemUgPSAxOCkpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHBhbDEpICsNCiAgbGFicyh4ID0gIkHDsW8iLCB5ID0gIkFycmlib3MgKFRvbmVsYWRhcykiKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTkyMCwgMjAxMCwgMTApLCBtaW5vcl9icmVha3MgPSBOVUxMKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMzc1LCA3NSksIG1pbm9yX2JyZWFrcyA9IE5VTEwpDQoNCmdnYW5pbWF0ZSh0d2Vlbl9wbG90LCB0aXRsZV9mcmFtZSA9IEZBTFNFLCBpbnRlcnZhbCA9IDAuMDAxLCAiTGFuZGluZ3NfQ0EuZ2lmIiwgYW5pLndpZHRoID0gODAwLCBhbmkuaGVpZ2h0ID0gNTAwKQ0KDQpgYGANCg0KIyMgQXJyaWJvcyBNZXhpY28NCg0KYGBge3IsIGZpZy53aWR0aCA9IDE2LCBmaWcuaGVpZ2h0ID0gOH0NCnJlYWRfY3N2KCJHU0JfTGFuZGluZ3NfbXguY3N2IiwgY29sX3R5cGVzID0gY29scygpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IEFubywgeSA9IEFycmlib3MpKSArDQogIGdlb21fbGluZShzaXplID0gMS4xLCBjb2xvciA9ICIjMzU3YzU3IikgKw0KICBnZW9tX3BvaW50KHNpemUgPSAyLCBjb2xvciA9ICIjMzU3YzU3IikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMC41LCAwLjUpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKDAuNywgMC43KSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiUmFsZXdheSIsIHNpemUgPSAyMCkpICsNCiAgbGFicyh4ID0gIkHDsW8iLCB5ID0gIkFycmlib3MgY29tZXJjaWFsZXMgZGUgTWVybyBHaWdhbnRlIFxuKFRvbmVsYWRhcykiKSArDQogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpDQoNCmdnc2F2ZSgiTWV4LnRpZmYiLCBkcGkgPSA2MDAsIHdpZHRoID0gMTYsIGhlaWdodCA9IDgpDQoNCmBgYA0KDQojIEJpb2xvZ2ljb3MNCg0KYGBge3J9DQpiaW8gPC0gcmVhZC5jc3YoZmlsZSA9ICJyZWNvcmRzLmNzdiIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGKSAlPiUgDQogIHNlbGVjdChTcGVjaWVzLCBTaXRlLCBTYWxlX3ByaWNlX3BrZywgRmlzaF9NYXJrZXRfbmFtZSwgQ2F0Y2hfc2l0ZSwgUGVzY2FfT2JqZXRpdm8sIFdlaWdodCwgVG90YWxfTGVuZ3RoLCBIZWFkX0xlbmd0aCwgV2VpZ2h0X25vdGVzLCBPdG9saXRocywgQ29sbGVjdG9yKSAlPiUgDQogIG1hZ3JpdHRyOjpzZXRfY29sbmFtZXModmFsdWUgPSB0b2xvd2VyKGNvbG5hbWVzKC4pKSkNCmBgYA0KDQoNCiMjIFJlZ2lzdHJvcyBwb3IgcGVyc29uYQ0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSAxMH0NCmNvbGVjdG9yZXMgPC0gZ3JvdXBfYnkoYmlvLCBzaXRlLCBjb2xsZWN0b3IpICU+JSANCiAgY291bnQoKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGNvbGxlY3RvciwgeSA9IG4pKSArDQogIGdlb21fY29sKGFlcyhmaWxsID0gc2l0ZSksIGNvbG9yID0gImJsYWNrIikgKw0KICBjb3dwbG90Ojp0aGVtZV9jb3dwbG90KCkgKw0KICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMSwgMSksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC45LCAwLjkpKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MSIpICsNCiAgZ2dFeHRyYTo6cm90YXRlVGV4dFgoKQ0KDQpwbG90bHk6OmdncGxvdGx5KGNvbGVjdG9yZXMpDQpgYGANCg0KIyMgSGlzdG9ncmFtYXMNCg0KYGBge3J9DQp0bCA8LSBnZ3Bsb3QoYmlvLCBhZXMoeCA9IHRvdGFsX2xlbmd0aCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA1ICwgZmlsbCA9IHBhbDFbMl0sIGNvbG9yID0gImJsYWNrIikgKw0KICB0aGVtZV9jbGFzc2ljKCkNCg0KdGwyIDwtIGdncGxvdChiaW8sIGFlcyh4ID0gdG90YWxfbGVuZ3RoKSkgKw0KICBnZW9tX2RlbnNpdHkoYmlud2lkdGggPSA1ICwgZmlsbCA9IHBhbDFbMl0sIGNvbG9yID0gImJsYWNrIikgKw0KICB0aGVtZV9jbGFzc2ljKCkNCg0KdHcgPC0gZ2dwbG90KGJpbywgYWVzKHggPSB3ZWlnaHQpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNSAsIGZpbGwgPSBwYWwxWzJdLCBjb2xvciA9ICJibGFjayIpICsNCiAgdGhlbWVfY2xhc3NpYygpDQoNCnR3MiA8LSBnZ3Bsb3QoYmlvLCBhZXMoeCA9IHdlaWdodCkpICsNCiAgZ2VvbV9kZW5zaXR5KGJpbndpZHRoID0gNSAsIGZpbGwgPSBwYWwxWzJdLCBjb2xvciA9ICJibGFjayIpICsNCiAgdGhlbWVfY2xhc3NpYygpDQoNCmNvd3Bsb3Q6OnBsb3RfZ3JpZCh0bCwgdGwyLCB0dywgdHcyLCBuY29sID0gMiwgbGFiZWxzID0gIkFVVE8iKQ0KYGBgDQoNCmBgYHtyfQ0KbW9kZWwgPC0gbG0obG9nMTAod2VpZ2h0KX5sb2cxMCh0b3RhbF9sZW5ndGgpLCBkYXRhID0gYmlvKQ0KDQp0aWR5X21vZGVsIDwtIGJyb29tOjp0aWR5KG1vZGVsKQ0KZ2xhbmNlX21vZGVsIDwtIGJyb29tOjpnbGFuY2UobW9kZWwpDQoNCnRleHRfbGluZWFyIDwtIGMoImxvZzEwKFRXKSA9IC01LjAzNjMgKyBsb2cxMChUTCleMy4xMTk4OyBSMiA9IDAuOTc5MyAocCA8IDAuMDAxKSIpDQoNCnRleHRfZXhwIDwtIGMoIlRXID0gMTBeKC01LjAzNjMpKihUTF4zLjExOTgpOyBSMiA9IDAuOTc5MyAocCA8IDAuMDAxKSIpDQpgYGANCg0KIyMgVFcgdnMgVEwNCg0KYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNX0NCg0KbGluZSA8LSBkYXRhLmZyYW1lKHggPSBzZXEoMCwgMjEwLCBieSA9IDEpKSAlPiUgDQogIG11dGF0ZSh5ID0gMTBeKC01LjAzNjMpKih4XjMuMTE5OCkpDQoNCkxXIDwtIGZpbHRlcihiaW8sICFpcy5uYSh0b3RhbF9sZW5ndGgpLA0KICAgICAgICAgICAgICFpcy5uYSh3ZWlnaHQpKSAlPiUgIA0KICBtdXRhdGUod2VpZ2h0X25vdGVzID0gaWZlbHNlKGlzLm5hKHdlaWdodF9ub3RlcyksICJObyBub3RlcyIsIHdlaWdodF9ub3RlcyksDQogICAgICAgICBzaXRlID0gaWZlbHNlKGlzLm5hKHNpdGUpLCAiTWlzc2luZyIsIHNpdGUpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHRvdGFsX2xlbmd0aCwgeSA9IHdlaWdodCkpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBsaW5lLCBhZXMoeCA9IHgsIHkgPSB5KSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBnZW9tX3BvaW50KHNpemUgPSAyLCBhbHBoYSA9IDAuNSwgYWVzKGNvbG9yID0gd2VpZ2h0X25vdGVzLCBzaXRlID0gc2l0ZSwgb3RvbGl0b3MgPSBvdG9saXRocykpICsNCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSBwYWwzKSArDQogIGxhYnMoeCA9ICJUb3RhbCBMZW5ndGggKGNtKSIsIHkgPSAiVG90YWwgV2VpZ2h0IChLZykiKSArDQogIGdndGl0bGUodGV4dF9leHApDQoNCnBsb3RseTo6Z2dwbG90bHkoTFcpDQpgYGANCg0KDQpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA1fQ0KTFcgPC0gZmlsdGVyKGJpbywgIWlzLm5hKHRvdGFsX2xlbmd0aCksDQogICAgICAgICAgICAgIWlzLm5hKHdlaWdodCkpICU+JSAgDQogIG11dGF0ZSh3ZWlnaHRfbm90ZXMgPSBpZmVsc2UoaXMubmEod2VpZ2h0X25vdGVzKSwgIk5vIG5vdGVzIiwgd2VpZ2h0X25vdGVzKSwNCiAgICAgICAgIHNpdGUgPSBpZmVsc2UoaXMubmEoc2l0ZSksICJNaXNzaW5nIiwgc2l0ZSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gbG9nMTAodG90YWxfbGVuZ3RoKSwgeSA9IGxvZzEwKHdlaWdodCksIGNvbG9yID0gd2VpZ2h0X25vdGVzLCBzaXRlID0gc2l0ZSwgb3RvbGl0b3MgPSBvdG9saXRocywgV2VpZ2h0ID0gd2VpZ2h0LCBMZW5ndGggPSB0b3RhbF9sZW5ndGgpKSArDQogIGdlb21fYWJsaW5lKHNsb3BlID0gMy4xMTk4LCBpbnRlcmNlcHQgPSAtNS4wMzYzLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsNCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSBwYWwzKSArDQogIGxhYnMoeCA9ICJUb3RhbCBMZW5ndGggKGNtKSIsIHkgPSAiVG90YWwgV2VpZ2h0IChLZykiKSArDQogIGdndGl0bGUodGV4dF9saW5lYXIpDQoNCnBsb3RseTo6Z2dwbG90bHkoTFcpDQpgYGANCg0KDQo=